package tv.acgn.advertisement.search.handler;

import lombok.extern.slf4j.Slf4j;
import tv.acgn.advertisement.search.enumconst.OperationTypeEnum;
import tv.acgn.advertisement.search.index.IndexAware;
import tv.acgn.advertisement.search.index.IndexDataTable;
import tv.acgn.advertisement.search.index.impl.AdPlanIndexImpl;
import tv.acgn.advertisement.search.indexobejct.AdPlanIO;

/**
 * @author : junG
 * @program : advertisement-ad-search
 * @description :
 *
 * 全量索引加载类
 * 1.索引之间存层级的划分 也就是依赖关系的划分
 * 2.全量索引其实是增量索引的一种特殊实现
 * @date : 2019-08-19 23:40
 **/

@Slf4j
public class AdLevelDataHandler {

    /**
     * 实现广告推广计划的第二层级索引实现。
     * （第一级为用户层级，但是用户层级不参与索引，所以从level 2开始）
     * 第二层级的索引是表示 不依赖于其他索引，但是可被其他索引所依赖
     */
    public static void handleLevel2Index(AdPlanTable adPlanTable, OperationTypeEnum type) {
        // 对象转换
        AdPlanIO planIndexObject = new AdPlanIO(
            adPlanTable.getPlanId(),
            adPlanTable.getUserId(),
            adPlanTable.getPlanStatus(),
            adPlanTable.getStartDate(),
            adPlanTable.getEndDate()
        );

        //调用通用方法处理，使用IndexDataTableUtils#of来获取索引的实现类bean
        handleBinlogEvent(
            // 在前一节我们实现了一个索引工具类，来获取注入的bean对象
            IndexDataTable.of(AdPlanIndexImpl.class),
            planIndexObject.getPlanId(),
            planIndexObject,
            type
        );
    }

    /**
     * 处理全量索引和增量索引的通用处理方式
     * K,V代表索引的键和值
     * 只投递 增删改三种模式的索引
     *
     * @param index 索引实现代理类父级
     * @param key   键
     * @param value 值
     * @param type  操作类型
     */
    private static <K, V> void handleBinlogEvent(IndexAware<K, V> index, K key, V value, OperationTypeEnum type) {
        switch (type) {
            case INSERT:
                index.add(key, value);
                break;
            case UPDATE:
                index.update(key, value);
                break;
            case DELETE:
                index.delete(key);
                break;
            default:
                break;
        }
    }

}
